package com.chagee.store.operation.server.utils;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName NumberUtil  //类名称
 * @Description: //类描述
 * @Author: Jacky-zhan	//作者
 * @CreateDate: 2024/7/10 10:17	//创建时间
 * @UpdateUser: Jacky-zhan  //变更者
 * @UpdateDate: 2024/7/10 10:17	//更新时间
 * @UpdateRemark: //更新的信息
 * @Version: 1.0    //版本号
 */
@Component
public class NumberUtil {

	/**
	 * 编号自动生成
	 *
	 * @param redisTemplate
	 * @param code 前缀 首字母大写
	 * @param nums 几位数字
	 * @return 编号
	 */

	private static final Long SERIAL_NUM_TIME_OUT = 24L;


	public static String generateSerialNum(@NotNull RedisTemplate<String, String> redisTemplate, String code, Integer nums) {
		// 使用StringBuilder拼接字符串
		StringBuilder sb = new StringBuilder();
		// 获取当前时间并定义日期格式
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
		LocalDateTime dateTime = LocalDateTime.now();
		String localDateFormat = dateTime.format(formatter);
		sb.append(code);
		sb.append(localDateFormat);

		// 将拼接好的字符串做key，获取redis中的数据
		String i = redisTemplate.opsForValue().get(sb.toString());
		int increment;
		if (i != null) {
			// 如果redis中有数据，则使用increment()将数据+1
			increment = Objects.requireNonNull(redisTemplate.opsForValue()
				.increment(sb.toString())).intValue();
		} else {
			// 如果redis中没有数据，则使用setIfAbsent()将数据设置为1
			increment = 1;
			redisTemplate.opsForValue().setIfAbsent(sb.toString(), String.valueOf(increment), SERIAL_NUM_TIME_OUT, TimeUnit.HOURS);
		}

		// 第一次format格式化nums位0，之后再格式化increment
		sb.append(String.format(String.format("%%0%dd", nums), increment));
		return sb.toString();
	}

}
